/*
 * @Author: cooper
 * @Date: 2025-06-08 22:51:19
 * @Wechat: cmd_develop
 * @Description:
 */
#ifndef __LCD_H
#define __LCD_H

#include "common.h"
// 分别为 0:状态 1:code 2:pos  3:said_id/movePos 4-7:id(mysql的键值) 7:scene场景，用于check 8:isEnd 是否为订单的最后一个

/*****5号RS485——LCD_配置*****/
// RS485串口数据缓冲区
#define LCD_DATA_SIZE 256
#define RX_LCD_BUFCLEAR()                     \
    do                                        \
    {                                         \
        for (u8 i = 0; i < RX_LCD_TOTAL; i++) \
        {                                     \
            RX_LCD(i) = 0;                    \
        }                                     \
        RX_LCD_TOTAL = 0;                     \
    } while (0)
#define TX_LCD_BUFCLEAR()                     \
    do                                        \
    {                                         \
        for (u8 i = 0; i < TX_LCD_TOTAL; i++) \
        {                                     \
            TX_LCD(i) = 0;                    \
        }                                     \
        TX_LCD_TOTAL = 0;                     \
    } while (0)
// RS485串口控制
typedef struct
{
    u8 rx_data[LCD_DATA_SIZE]; /*接收数据缓冲区*/
    u8 rx_total;               /*接收数据大小*/

    u8 tx_data[LCD_DATA_SIZE]; /*发送数据缓冲区*/
    u8 tx_total;               /*发送总数据大小*/
} LCD_buffer;
extern LCD_buffer LCD_Buffer;
extern s16 ice_temp;

extern QueueHandle_t lcd_work_queue; // LCD工作邮箱
#define RX_LCD(x) LCD_Buffer.rx_data[x]
#define RX_LCD_TOTAL LCD_Buffer.rx_total
#define TX_LCD(x) LCD_Buffer.tx_data[x]
#define TX_LCD_TOTAL LCD_Buffer.tx_total
#define LCD_queue_num 10            // 队列里的数据最大容量
#define MAX_SIZE 100                // 队列里的数据最大容量
#define lcd_work_queue_array_num 10 // lcd队列的消息大小
#define ICE_CHECK_TIME 60           // 冰柜的报警时间 5*60,在温控板里处理，温控板是5s一个时间片
#define ICE_CHECK_TEMP 10           // 冰柜的报警温度
typedef enum
{
    LCD_WAIT,
    SEND_ICEBOX_CODE,
    SEND_LCD_CODE,
    SEND_RELAY_CODE,
    SEND_STICK_ZERO_CODE,
    SEND_STICK_MOVE_CODE,
    SEND_STICK_DISTANCE_CODE,
    LCD_RX_CODE
} LCD_CODE;

// 外部使用
void LCD_Init(void);
void LCD_TASK(void);   // MODBUSDIO主机有关任务
void STICK_TASK(void); // 签盒任务

// 队列操作
typedef unsigned char QueueElement;
typedef struct
{
    QueueElement data[MAX_SIZE][LCD_queue_num];
    int front;
    int rear;
} LCD_queue;
extern LCD_queue lcd_queue;

void initQueue(LCD_queue *q);
int isEmpty(LCD_queue *q);
int isFull(LCD_queue *q);
void enqueue(LCD_queue *q, QueueElement value[]);
void dequeue(LCD_queue *q);
void printQueue(LCD_queue *q);
void arrayToQueue(LCD_queue *q, QueueElement arr[][LCD_queue_num], int size);
void insertAtFront(LCD_queue *q, QueueElement value[LCD_queue_num]);

#endif
